package cn.edu.nsmc.modules.app.controller;


import cn.edu.nsmc.common.utils.PlatformEnum;
import cn.edu.nsmc.common.utils.R;
import cn.edu.nsmc.common.utils.UserTypeEnum;
import cn.edu.nsmc.common.validator.ValidatorUtils;
import cn.edu.nsmc.modules.app.form.LoginForm;
import cn.edu.nsmc.modules.app.service.UserService;
import cn.edu.nsmc.modules.app.utils.JwtUtils;
import cn.edu.nsmc.modules.sys.entity.SysUserEntity;
import cn.edu.nsmc.modules.sys.service.SysCaptchaService;
import cn.edu.nsmc.modules.sys.service.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * APP登录授权
 */
@RestController
@RequestMapping("/app")
@Api("APP登录接口")
public class AppLoginController {
    @Autowired
    private UserService userService;
    @Autowired
    private SysUserService sysUserService;
    @Autowired
    private JwtUtils jwtUtils;

    @Autowired
    private SysCaptchaService sysCaptchaService;

    /**
     * 登录
     */
    @PostMapping("login")
    @ApiOperation("登录")
    public R login(@RequestBody LoginForm form) {
        //表单校验
        ValidatorUtils.validateEntity(form);

        //用户登录
        long userId = userService.login(form);

        //生成token
        String token = jwtUtils.generateToken(userId);

        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        map.put("expire", jwtUtils.getExpire());

        return R.ok(map);
    }

    @PostMapping("wx/login")
    @ApiOperation("登录")
    public R wxLogin(@RequestBody LoginForm form) {
        //表单校验
        ValidatorUtils.validateEntity(form);

        if(form.getFromWhere().equals(PlatformEnum.USER.name())) {
            boolean captcha = sysCaptchaService.validate(form.getCodeUUID(), form.getCode());
            if(!captcha){
                return R.error("验证码不正确，请重新输入（不区分大小写）");
            }
        }
        
        //用户信息
        SysUserEntity info = sysUserService.queryByMobile(form.getMobile());

        //账号不存在、密码错误
        if(info != null && !info.getPassword().equals(new Sha256Hash(form.getPassword(), info.getSalt()).toHex())) {
            return R.error("账号或密码不正确");
        }

        if (info == null) {     // 用户不存在
            // 管理端禁止自动注册
            if(PlatformEnum.ADMIN.name().equals(form.getFromWhere())){
                return R.error("账号不存在");
            }
            // 用户端不存在用户的逻辑
            // 密码强度校验
            if (!ValidatorUtils.isStrongPassword(form.getPassword())) {
                return R.error("注册账号失败：密码不符合规则，请设置至少8位并包含字母和数字的密码");
            }
            
            info = new SysUserEntity();
            info.setMobile(form.getMobile());
            info.setUsername("user_"+ RandomStringUtils.randomAlphanumeric(8));
            info.setPassword(form.getPassword());
            info.setCreateTime(new Date());
            //  管理端默认创建维修人员
            if(PlatformEnum.ADMIN.name().equals(form.getFromWhere())) {
                info.setType(5);
            } else {
                info.setType(4);
            }
            sysUserService.saveUser(info);
        } else {        // 用户存在
            if(PlatformEnum.ADMIN.name().equals(form.getFromWhere())){
                // 管理小程序仅允许管理员和维修人员，如果不是管理员和维修人员就禁止登录
                if(info.getType() != UserTypeEnum.ADMIN.getValue() 
                        && info.getType() != UserTypeEnum.ADMIN_OLD.getValue() 
                        && info.getType() != UserTypeEnum.REPAIRMAN.getValue()){
                    return R.error("账号或密码不正确，仅支持管理员和维修人员登录");
                }
            } else {
                // 用户端禁止管理员和维修人员登录
                if((info.getType() == UserTypeEnum.ADMIN.getValue()
                        || info.getType() == UserTypeEnum.REPAIRMAN.getValue()
                        || info.getType() == UserTypeEnum.ADMIN_OLD.getValue()
                )  && PlatformEnum.USER.name().equals(form.getFromWhere())){
                    return R.error("账号或密码不正确，仅支持普通用户登录");
                }
            }
        }
        info.setPassword(null);
        info.setSalt(null);

        return R.ok().put("data",info);
    }

}
